package Static;
/**本类用于测试代码块之间的关系*/
//结论:执行顺序:静态代码块 --> 构造代码块 --> 构造方法 --> 局部代码块
public class TestBlock {

    public static void main(String[] args) {
        //1.创建对象进行测试执行顺序
        /**1.在创建对象之前,会自动执行静态代码块,而且此【static代码块只加载一次并只输出显示一次】*/
        /**2.在创建对象时,会自动调用构造代码块和构造方法,构造代码块先执行*/
        Person p = new Person();//此时此刻
        p.study();
        System.out.println("--------------------");
        //2.再次创建对象进行测试
        Person p2 = new Person();
        p2.study();////再去创建对象并执行study方法时,static静态代码块也不会再次加载了

    }

}


class Person{
    /**静态代码块：static{}
     * 位置：类里方法外
     * 触发：随类的加载而加载，优先于对象加载输出【创建对象时就仅执行一次】
     *作用：用于加载第一时间需要加载的资源，且只加载一次。
     * */
    static{
        System.out.println("我是静态代码块~~");//优先1
    }
    { //构造代码块：类里方法外 +创建对象时触发，优先于构造方法+用来提取构造方法中的共性内容
        System.out.println("我是构造代码块");//优先2
    }
    public Person() {//构造方法： +创建对象时触发 +用于创建对象

        System.out.println("我是无参构造方法");//优先3
    }
    public void study(){
        System.out.println("我是一个普通方法");//优先4
        {//局部代码块：方法里+调用本方法时+用来控制变量的作用范围，其范围越小越好
            System.out.println("wo是局部代码块");//最后5
        }
    }
}


//总结:
//1.代码之间的执行顺序:1.静态代码块-->2.构造代码块-->3.构造方法【创建好对象】-->4.局部代码块
//2.为什么是这样的顺序呢?
/**静态代码块要优先于对象进行加载
 * 是随着类的加载而加载到内存中的
 * 只加载一次,并且一直存在,直到类消失,它才会消失
 */
/**3.每个元素的作用:
 //3.1)静态代码块:在创建对象前先自动执行静态代码块，只加载执行一次。
 //3.2)构造代码块:创建对象时才会触发,用来提取构造方法中的共性内容
 //3.3)构造方法:创建对象时调用,用来创建对象,在构造代码块执行后执行

 //3.4)局部代码块:当对象调用本类的方法时，局部代码块才会被调用,用来控制变量的作用范围
 */